package com.linkdood.app.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.linkdood.app.component.QuartzJobComponent;
import com.linkdood.app.constants.ErrorCode;
import com.linkdood.app.domain.ScheduleTask;
import com.linkdood.app.dto.ScheduleTaskDTO;
import com.linkdood.app.enums.TaskStatusEnum;
import com.linkdood.app.exception.GeneralException;
import com.linkdood.app.mapper.ScheduleTaskMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

/**
 * 定时任务 Service 类
 *
 * @author hycao
 */
public interface ScheduleTaskService extends IService<ScheduleTask> {

    /**
     * 创建定时任务
     *
     * @param task 任务
     * @return 是否创建成功
     */
    ScheduleTask saveTask(ScheduleTaskDTO task);

    /**
     * 暂停任务
     */
    ScheduleTask pauseTask(String taskId);

    /**
     * 恢复任务。
     */
    ScheduleTask resumeTask(String taskId);

    /**
     * 启动任务
     *
     * @param task 任务
     * @return 是否创建成功
     */
    ScheduleTask startTask(ScheduleTask task);

    /**
     * 修改旧的定时任务， 只支持修改定时时间
     *  @param oldTask 旧任务
     * @param task 修改后的任务
     */
    ScheduleTask modifyTaskCron(ScheduleTask oldTask, ScheduleTaskDTO task);

    /**
     * 删除旧的定时任务，创建新的定时任务
     *  @param oldTask 旧任务
     * @param task 修改后的任务
     */
    ScheduleTask modifyTask(ScheduleTask oldTask, ScheduleTaskDTO task);
    /**
     * 获取任务分页信息
     */
    Page<ScheduleTask> pageTasks(LambdaQueryWrapper<ScheduleTask> queryWrapper, Page<ScheduleTask> page);

    /**
     * 删除任务
     * @param id 任务id
     */
    void deleteTask(String id);


}
